所有执行IO操作的系统调用都以文件描述符来指代打开的文件。 文件描述符是非负整数

每个进程,文件描述符都自成一套。

shell进程默认打开3个文件描述符:0、1、2 程序继承shell文件描述符副本,所以也默认打开。

4-1

UNIX I/O模型的显著特点之一:输入/输出的通用性概念。这意味着使用4个同样的系统调用open()、read()、write()、close()可以对所有类型的文件执行I/O操作。

要实现通用I/O,就必须确保每一文件系统和设备驱动程序都实现了相同的I/O系统调用集。

当需要访问文件系统或设备的专有功能时,可以使用ioctl()系统调用,该调用为通用I/O模型之外的专有特性提供了访问接口。

#include <sys/stat.h>
#include <fcntl.h>

//成功返回文件描述符,失败返回-1并将errno置为相应的标志位
int open(const char *pathname, int flags, .../* mode_t mode */);
  • 如果pathname是符号链接,会对其作解引用

  • flags为位掩码,用于指定文件的访问模式

    image-20220802201231009
  • mode为位掩码,当open()没有指定O_CREAT标志时,可以省略,作用是指定新创建文件的访问权限

新建文件的访问权限:

  • 不仅仅依赖于参数mode
  • 受进程umask值的影响
  • 受父目录的默认访问控制列表(可能存在)的影响

open()调用成功,必须保证其返回值为进程未用文件描述符中数值最小者。可以丽影该特性以特定文件描述符打开某一个文件。

image-20220802202634825

4-3表中常量分为3组:

  • 文件访问模式标志:三种在flags参数中不能同时使用,能通过fcntl()的F_GETFL操作检索文件的访问模式
  • 文件创建标志:这些标志不能检索,无法修改
  • 已打开文件的状态标志:使用fcntl()的F_GETFL和F_SETFL操作可以分别检索和修改这些标志,故又称文件状态标志